
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path, {resolve} from 'path'
import chalk from 'chalk' // console高亮

// 引入多页面配置文件
const projectList = require('./multiPages.json')
// 获取npm run dev后缀 配置的环境变量
const npm_config_platform = process.env.npm_config_platform || ''
// 命令行报错提示
const errorLog = (error) => console.log(chalk.red(`${error}`))

//获取指定的单页面入口
const getEnterPages = () => {
  if (!npm_config_platform) {
    errorLog('⚠️ 警告 -- 请在命令行后以 `--platform=平台名称` 格式指定平台名称！')
  }
   
  const filterArr = projectList.filter(
    (item) => item.chunk.toLowerCase() == npm_config_platform.toLowerCase()
  )

  if (!filterArr.length) {
    errorLog(` ⚠️ 警告 -- 不存在此平台，${npm_config_platform}，请检查平台名称！`)
  }
  return {
    [npm_config_platform]: path.resolve(
      __dirname,
      `./${npm_config_platform}/index.html`
    )
  }
}

// 打包提示
const buildEndFn = (name)=>{
  const t = projectList.find(
    (item) => item.chunk.toLowerCase() == npm_config_platform.toLowerCase()
  )
  console.log(` 
  -----${chalk.green.bold('项目构建成功')}:${chalk.white.bold(` ${t.platformName} ${name} `)}-----
  `)
}

export default defineConfig({
  root: path.resolve(__dirname, `./${npm_config_platform}`),
  base: '/',
  envDir: path.resolve(__dirname, `./${npm_config_platform}/env`), //用于加载 .env 文件的目录。可以是一个绝对路径，也可以是相对于项目根的路径。
  assetsInclude: /\.(gltf|glb)/,
  esbuild: {
    jsxFactory: 'h',
    jsxFragment: 'Fragment',
    jsxInject: "import { h } from 'vue';"
  },
  plugins: [
    vue(),
  ],
  resolve: {
    alias: {
      '@': path.join(__dirname, './shared'), // 共享的资源
      '@src_two': path.join(__dirname, './src_two'), // 储能
      '@src_one': path.join(__dirname, './src_one') // 储充
    }
  },
  server: {
    host: 'localhost', // 指定服务器主机名
    port: 3880, // 指定服务器端口
    hmr: true,  // 开启热更新
    open: true, // 在服务器启动时自动在浏览器中打开应用程序
  },
  build: {
    outDir: path.resolve(__dirname, `dist/${npm_config_platform}`), // 指定输出路径
    assetsInlineLimit: 4096, //小于此阈值的导入或引用资源将内联为 base64 编码，以避免额外的 http 请求
    emptyOutDir: true, //Vite 会在构建时清空该目录
    chunkSizeWarningLimit: 1000,
    reportCompressedSize: false,
    copyPublicDir: false,
    minify: 'esbuild', // 使用esbuild压缩代码
    cssMinify: false,
    cssCodeSplit: true, 
    esbuild: {
      drop: ['console', 'debugger'], // 移除 console 和 debugger
      // 防止 Infinity 被压缩成 1/0（Chrome 性能问题）
      keepNames: true, // 保留函数和类名
      legalComments: 'none', // 移除所有注释
      // 其他可选优化
      minifyWhitespace: true, // 压缩空白字符
      minifyIdentifiers: true, // 压缩标识符
      minifySyntax: true, // 压缩语法
    },
  
    rollupOptions: {  //自定义底层的 Rollup 打包配置
      input: getEnterPages(),
      buildEnd: buildEndFn(npm_config_platform),
      output: {
        assetFileNames: '[ext]/[name]-[hash].[ext]', //静态文件输出的文件夹名称
        chunkFileNames: 'js/[name]-[hash].js',  //chunk包输出的文件夹名称
        entryFileNames: 'js/[name]-[hash].js',  //入口文件输出的文件夹名称
        compact: true,
        manualChunks: (id) => {
          if (id.includes('node_modules')) {
            return id
              .toString()
              .split('node_modules/')[1]
              .split('/')[0]
              .toString() // 拆分多个vendors
          }
        }
      }
    },
  }
})